/**
 * @file       timer.hpp
 * @author     WMQ
 * @date       2025/1/17
 * @brief      定时线程
 */

#ifndef TIMER_HPP
#define TIMER_HPP

#include <cstdint>
#include <functional>
#include <mutex>
#include <thread>

#include "thread_func.hpp"

/**
 * @brief 定时线程Timer类
 */
class Timer
{
public:
    /**
     * @brief 开启线程周期执行任务
     * @param[in] cycle_time 周期时间
     * @param[in] interval 最小步进时间
     * @param[in] task 周期执行的任务
     */
    void Start(uint32_t cycle_time, uint32_t interval, const std::function<void()> &task)
    {
        run_thread_ = std::thread([this, cycle_time, interval, task]() {
            auto start = std::chrono::steady_clock::now();
            while (!run_thread_exit_flag_)
            {
                ThreadFunc::SleepFor(interval);
                auto end = std::chrono::steady_clock::now();
                auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
                if (duration.count() >= cycle_time)
                {
                    task();
                    start = std::chrono::steady_clock::now();
                }
            }
        });
    }

    /**
     * @brief 停止执行
     */
    void Stop()
    {
        run_thread_exit_flag_ = true;
        if (run_thread_.joinable())
        {
            run_thread_.join();
        }
    }

private:
    std::thread run_thread_;            /**< 工作线程 */
    bool run_thread_exit_flag_ = false; /**< 线程退出标识 */
};

#endif